home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / amiexpress / source / doors / chat / chat.c next >
Encoding:
C/C++ Source or Header  |  1992-12-26  |  8.1 KB  |  356 lines

  1. #include "chat.h"
  2. #include <libraries/dos.h>
  3. #include <intuition/intuitionbase.h>
  4. #include "dh0:code/aelib/ae_pragmas.h"
  5. extern int LocalLog;
  6. extern struct MsgPort *port;
  7. extern struct MsgPort *replymp;
  8. extern struct JHMessage *Jhmsg,*msg;
  9. extern struct Library *AEBase;
  10. struct MsgPort *CreateMasterPrt(UBYTE *name,LONG pri);
  11. char myportnm[10], repportnm[20];
  12. char portnm[NODENUM][20];
  13. int allowed=0;
  14. struct MsgPort *myport, *repport, *otport[NODENUM];
  15. struct MSMes mymes, mesbuf, *otmes;
  16. char mynm[NAMELEN], fname[100];
  17. FILE *str;
  18.  
  19. char mynm[NAMELEN], otnm[NODENUM][NAMELEN], mainline[100], actst[80],
  20.      namest[50][40];
  21. char dispbuf[100], inkey[100];
  22. int i, j, in, mynd, dnd, col, otno, nodenum, inpt, nmfl, elnfl;
  23. void quitroom(void);
  24. enum Activity act;
  25. enum MainArg mainarg;
  26. #define StartChatReq ChatPermit(1)
  27. #define EndChatReq   ChatPermit(0)
  28. struct SignalSemaphore *sema;
  29. void InitSemi(void);
  30. char SemiName[]= "/X_ChatSemi";
  31. main(int argc,char *argv[])
  32. {
  33.   char t[100];
  34.   Register(argv[1][0]-'0');
  35.   mynd = argv[1][0]-'0'; 
  36.   InitSemi();
  37.   getuserstring(t,BB_TASKPRI);
  38.   Forbid();
  39.   SetTaskPri(FindTask(0),atol(t));
  40.   Permit();
  41.   getuserstring(mynm,DT_NAME);
  42.   getuserstring(mainline,BB_MAINLINE);
  43.   mainarg = parsemain();
  44.   switch( mainarg ) {
  45.    case ON: chaton(); CloseOut();
  46.    case OFF: chatoff(); CloseOut();
  47.    case ERR: chathelp(); CloseOut();
  48.    case NONE: break;
  49.   };
  50.  
  51.   putuserstring( "\tUsing AEChat Door\n",BB_CALLERSLOG);
  52.   elnfl = 1;
  53.   intro();
  54.   allowed=1;
  55.   dnd = -1;
  56.   nmfl = inpt = col = 0;
  57.   strcpy(inkey," ");
  58.   
  59.   //sprintf(inkey,"%dm ", mynd>7 ? 0:mynd+1);
  60.   //inpt=4;
  61.   FOREVER {
  62.     inkey[0]=sigkey(); 
  63.     
  64.     switch( inkey[0] ) {
  65.      case '\0':
  66.   otmes = (struct MSMes *) GetMsg( myport );
  67.     memcpy( &mesbuf, otmes, sizeof(struct MSMes) );
  68.     if(mesbuf.Type==ADD)
  69.     {
  70.        strcpy( otmes->String, mynm );
  71.     }
  72.     ReplyMsg( (struct Message *) otmes );
  73.     switch( mesbuf.Type ) {
  74.      case MES: disp( mesbuf.String, mesbuf.NodeID );
  75.                break;
  76.      case NEWL:dnd = mesbuf.NodeID;
  77.                newln(dnd);
  78.                break;
  79.      case ADD: addnew( mesbuf.String, mesbuf.NodeID );
  80.                dnd = -1;
  81.                break;
  82.      case QUIT:kill( mesbuf.NodeID );
  83.                dnd = -1;
  84.                break;
  85.      default:  sm1( "system error 238"); 
  86.                break;
  87.                /*MSCloseOut();*/
  88.     } break;
  89.      case CTRL('N'): chatwho(1); break;
  90.      case CTRL('F'): dispmenu(); break;
  91.      case CTRL('X'):
  92.       quitroom();
  93.       MSCloseOut();
  94.      case CTRL('P'): page(); break;
  95.      default:
  96.       disp( &inkey, mynd );
  97.       send( MES, ALL );
  98.       
  99.     }
  100.    }
  101.  
  102.   MSCloseOut(); 
  103.  
  104. }
  105. void InitSemi(void)
  106. {
  107.   char *Name;
  108.   Forbid();
  109.   if(!(sema=FindSemaphore(SemiName)))
  110.   {
  111.      if(sema=(struct SignalSemaphore *)
  112.         AllocMem(sizeof(struct SignalSemaphore),MEMF_PUBLIC|MEMF_CLEAR))
  113.      {
  114.   Name=AllocMem(strlen(SemiName)+2,MEMF_PUBLIC|MEMF_CLEAR);
  115.   strcpy(Name,SemiName);
  116.  
  117.        sema->ss_Link.ln_Pri=0;
  118.        sema->ss_Link.ln_Name=Name;
  119.        AddSemaphore(sema);
  120.      }
  121.   }
  122.   Permit();
  123. }    
  124. send( type, who )
  125. {
  126. int i;
  127.  
  128.    mymes.Type = type;
  129. start:
  130.    switch( type ) {
  131.     case MES:
  132.      strcpy( mymes.String, inkey );
  133.      break;
  134.     case INFO:
  135.      strcpy( mymes.String, mynm );
  136.      break;
  137.     case ADD:
  138.      strcpy( mymes.String, mynm );
  139.      break;
  140.     case NEWL:
  141.     case QUIT:
  142.      break;
  143.    };
  144.    if( who != ALL ) {
  145.     if(!AttemptSemaphore(sema)) return(0);
  146.     PutMsg( otport[who], (struct Message *)&mymes);
  147.     WaitPort(repport);
  148.     if(type==ADD)
  149.     {
  150.       otmes=(struct MSMes *)GetMsg( repport ); 
  151.       strcpy( otnm[who], otmes->String );
  152.     }else GetMsg(repport);
  153.     ReleaseSemaphore(sema);
  154.    }
  155.    else {
  156.     for( i = 0; i < NODENUM; i++ ) {
  157.      if( otport[i] == 0 ) continue;
  158.      if(!AttemptSemaphore(sema)) return(0);
  159.      PutMsg( otport[i], (struct Message *)&mymes);
  160.      WaitPort(repport);GetMsg(repport );
  161.  
  162.      ReleaseSemaphore(sema);
  163.     };
  164.    };
  165.  
  166.   return(0);
  167.  
  168. }
  169. intro()
  170. {
  171. int i;
  172.  
  173.   op( mynd );
  174.   otno = 0;
  175.   Jhmsg->signal=1L<<myport->mp_SigBit;
  176.   for( i = 0; i < NODENUM; i++ ) {
  177.    otport[i] = 0;
  178.    if( i == mynd ) continue;
  179.    sprintf( portnm[i], "AEChat%d", i );
  180.    otport[i]=FindPort( (UBYTE *) portnm[i] );
  181.    if( otport[i] ) {
  182.     otno++;
  183.     send( ADD, i );
  184.     //WaitPort( myport );
  185.     //otmes = (struct MSMes *) GetMsg( myport );
  186.     //ReplyMsg( (struct Message *) otmes );
  187.    };
  188.   };
  189.   showmessage();
  190.   listother();
  191.   eln();
  192.   sm2( "Press <Ctrl-F> To Display Functions" );
  193.   return(0);
  194. }
  195.  
  196. op(node)
  197. {
  198.  sprintf( myportnm, "AEChat%d", node );
  199.  myport=CreateMasterPrt(myportnm,0L);
  200.  if(myport==0) { sm1("Couldn't create port"); MSCloseOut(); };
  201.  sprintf( repportnm, "AEChatReply%d", node );
  202.  repport=CreatePrt(repportnm,0L);
  203.  if(repport==0) { sm1("Couldn't create reply port"); MSCloseOut(); };
  204.  
  205.  mymes.Msg.mn_ReplyPort=repport;
  206.  mymes.Msg.mn_Node.ln_Type=NT_MESSAGE;
  207.  mymes.Msg.mn_Length=sizeof(struct MSMes);
  208.  mymes.NodeID = mynd;
  209.  return(0);
  210. }
  211.  
  212. dispmenu()
  213. {
  214. eln();
  215. sm2( "<Ctrl-X>: Exit chat   <Ctrl-N>: Who's online   <Ctrl-P>: Page Other Nodes   " );
  216. return(0);
  217. }
  218.  
  219. prd( i )
  220. {
  221. char tm[20];
  222. sprintf( tm, " %d ", i ); sm0( tm );
  223. return(0);
  224. }
  225.  
  226. addnew( nm, nd )
  227. char *nm;
  228. {
  229.   strcpy( otnm[nd], nm );
  230.   eln();
  231.   sm0( ">>>>> " ); sm0( nm ); sm0( " On Node: (" ); prd( nd );
  232.   sm1( ") Has Entered The Chat Room!" );
  233.   cr();
  234.   col = 0;
  235.   sprintf( portnm[nd], "AEChat%d", nd );
  236.   otport[nd]=FindPort( (UBYTE *) portnm[nd] );
  237.   if( otport[nd] == 0 ) { sm1("Couldn't create port"); MSCloseOut(); };
  238.   return(0);
  239. }
  240.         
  241. kill( nd )
  242. {
  243.   eln();
  244.   sm0( ">>>>> " ); sm0( otnm[nd] ); sm0( " On Node: (" ); prd( nd );
  245.   sm1( ") Has Left The Chat Room!" );
  246.   cr();
  247.   col = 0;
  248.   otport[nd]=0;
  249.   strcpy( otnm[nd], "Killed!" );
  250.   return(0);
  251. }
  252.  
  253. void quitroom(void)
  254. {
  255.    static int processed=FALSE;
  256.    
  257.    //char temp[100];
  258. if(processed==TRUE) return; else processed=TRUE;
  259.    while( (otmes = (struct MSMes *) GetMsg( myport ))) {
  260.     mesbuf.NodeID = otmes->NodeID;
  261.     switch( otmes->Type ) {
  262.      case QUIT:ReplyMsg( (struct Message *) otmes );
  263.                kill( mesbuf.NodeID );
  264.                break;
  265.      default:  ReplyMsg( (struct Message *) otmes );
  266.                continue;
  267.     };
  268.    };
  269.  
  270.    send( QUIT, ALL );
  271.         cr();
  272.         sm2( "<Exiting From Chat>" );
  273.         Delay( 30 );  
  274.    RemPort( myport );
  275.    RemPort( repport );
  276.    return;
  277. }
  278.  
  279. newln( n )
  280. {
  281.  if( elnfl == 0 ) cr();
  282.  if( col ) cr();
  283.  if( n == mynd ) { smc0( mynm, 31 ); col = strlen( mynm )+2; }
  284.  else { smc0( otnm[n], 32+n ); col = strlen( otnm[n] )+2; };
  285.  smc0( "> ", 36 );
  286.  dnd = n;
  287.  nmfl = col;
  288.  elnfl = 0;
  289.  return(0);
  290. }
  291.  
  292. smc0( s, c )
  293. char s[];
  294. {
  295. char tm[100];
  296.  
  297.  sprintf( tm, "%dm%s", c, s );
  298.  sm0( tm );
  299.  return(0);
  300. }
  301.  
  302. nlif()
  303. {
  304.  if( col == 0 ) {
  305.   return(0);
  306.  };
  307.  cr(); col = 0;
  308.  return(0);
  309. }
  310.  
  311. eln()
  312. {
  313.   nlif(); cr();
  314.   elnfl = 1;
  315.   return(0);
  316. }
  317. showmessage()
  318. {
  319.   cr();
  320.   sm1( " .--------------------------------------------------------------------------." );
  321.   sm1( " | Ami-Express Multi-Node Interactive Chat Version 1.1 Written by ]B]E]E]F  |");
  322.   sm1( " |                        Written for The Boiler Room.                      |");
  323.   sm1( " |                /X Development Team - The Silent Achievers                |");
  324.   sm1( " `--------------------------------------------------------------------------'");
  325.   cr();
  326.   return(0);
  327. }
  328.  
  329. struct MsgPort *CreateMasterPrt(UBYTE *name,LONG pri)
  330. {
  331.   //int sigBit;
  332.   struct MsgPort *mp;
  333.   
  334.   //if((sigBit=AllocSignal(-1L))==-1)
  335.   //  return(NULL);
  336.   mp=(struct MsgPort *)
  337.      AllocMem((ULONG)sizeof(struct MsgPort),(ULONG)MEMF_CLEAR|MEMF_PUBLIC);
  338.   if(!mp)
  339.   {
  340.    // FreeSignal(sigBit);
  341.     return(NULL);
  342.   }
  343.   mp->mp_Node.ln_Name=name;
  344.   mp->mp_Node.ln_Pri=pri;
  345.   mp->mp_Node.ln_Type=NT_MSGPORT;
  346.   mp->mp_Flags=PA_SIGNAL;
  347.   mp->mp_SigBit=getsignal();
  348.   putuserstring("",BB_GETTASK);
  349.   mp->mp_SigTask=(struct Task *)Jhmsg->aeproc;
  350.   if(name)
  351.     AddPort(mp);
  352.   else
  353.     NewList(&(mp->mp_MsgList));
  354.   return(mp);
  355. }
  356.